<?php
/**
 * 会员登录特性
 *
 * @date    2020-10-21 09:19:00
 * @version $Id$
 */

namespace App\Commons\Domain\Module\UserCenter\Traits;

use App\Commons\Domain\Module\UserCenter\Entity\UserEntity;
use App\Commons\Domain\Module\UserCenter\Model\Member;

trait MemberLoginTrait
{
    private static string $CACHE_KEY = 'MEMBER_INFO:';
    private static int $CACHE_SECOND = 3600;

    /**
     * 移除登录缓存
     * @param Member $member
     * @return mixed
     * @throws \Exception
     */
    public function forgetLoginInfo(Member $member)
    {
        $key = static::$CACHE_KEY . $member->uid;

        return cache()->tags(['account'])->forget($key);
    }

    /**
     * 用户登录
     * @param Member $member 会员模型
     * @param string $ip 登录ip
     * @return mixed
     * @throws \Exception
     */
    public function userLogin(Member $member, string $ip = null)
    {

        // 更新登录时间ip和次数
        app(UserEntity::class)->updateUserLogin($member, $ip ?: '127.0.0.1');

        // 清楚上次登录缓存
        $this->forgetLoginInfo($member);

        return $member;
    }

    /**
     * 用户信息
     * @param Member $member 会员模型
     * @return mixed
     * @throws \Exception
     */
    public function userInfo(Member $member)
    {
        $key_user = static::$CACHE_KEY . $member->uid;

        // 缓存用户信息 一个小时，并标志为账户领域缓存
        // 执行cache()->tags(['account'])->flush() 将清除整个账户领域的缓存
        $info = cache()->tags(['account'])->remember(
            $key_user,
            static::$CACHE_SECOND,
            function () use ($member) {
                // 从数据库查询用户最新数据进行缓存
                $member = $member->query()->whereKey($member->id)
                    ->select([
                        'id',
                        'uid',
                        'username',
                        'nickname',
                        'mobile',
                        'avatar',
                        'email',
                        'realname',
                        'jy_password'
                    ])
                    ->first();
                $member['jy_password'] = $member['jy_password'] ? true : false;
                return $member;
            }
        );

        // 保留权限信息
        $auth = [];

        return compact('info', 'auth');
    }

    /**
     * 用户退出登录
     *
     * @param string $token 登录token
     *
     * @return [type]        [description]
     */
    public function userLogout(string $token)
    {
        // TODO: 待添加用户上下线功能
        // return app(TokenEntity::class)->removeToken($token);
    }
}
